package com.itjin.health.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itjin.health.common.BaseResponse;
import com.itjin.health.common.ResultUtils;
import com.itjin.health.domain.dto.InjuryReportAddRequest;
import com.itjin.health.domain.dto.InjuryReportUpdateRequest;
import com.itjin.health.domain.vo.InjuryReportDetailVO;
import com.itjin.health.domain.vo.InjuryReportVO;
import com.itjin.health.exception.BusinessException;
import com.itjin.health.exception.ErrorCode;
import com.itjin.health.service.InjuryReportService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

@RestController
@RequestMapping("/injury")
@Api(tags = "伤病报告接口")
@Slf4j
public class InjuryController {

  @Resource
  private InjuryReportService injuryReportService;

  /**
   * 添加伤病报告
   *
   * @param injuryReportAddRequest 添加伤病报告请求
   * @param userId                 用户ID
   * @return 伤病报告ID
   */
  @PostMapping("/report")
  @ApiOperation(value = "添加伤病报告")
  public BaseResponse<Integer> addInjuryReport(
      @RequestBody InjuryReportAddRequest injuryReportAddRequest,
      @RequestParam Integer userId) {
    if (injuryReportAddRequest == null || userId == null) {
      throw new BusinessException(ErrorCode.PARAMS_ERROR);
    }

    // 添加伤病报告
    Integer reportId = injuryReportService.addInjuryReport(injuryReportAddRequest, userId);
    return ResultUtils.success(reportId);
  }

  /**
   * 更新伤病报告
   *
   * @param injuryReportUpdateRequest 更新伤病报告请求
   * @param userId                    用户ID
   * @return 更新结果
   */
  @PutMapping("/report")
  @ApiOperation(value = "更新伤病报告")
  public BaseResponse<Boolean> updateInjuryReport(
      @RequestBody InjuryReportUpdateRequest injuryReportUpdateRequest,
      @RequestParam Integer userId) {
    if (injuryReportUpdateRequest == null || injuryReportUpdateRequest.getId() == null || userId == null) {
      throw new BusinessException(ErrorCode.PARAMS_ERROR);
    }

    // 更新伤病报告
    boolean result = injuryReportService.updateInjuryReport(injuryReportUpdateRequest, userId);
    return ResultUtils.success(result);
  }

  /**
   * 删除伤病报告
   *
   * @param id     伤病报告ID
   * @param userId 用户ID
   * @return 删除结果
   */
  @DeleteMapping("/report/{id}")
  @ApiOperation(value = "删除伤病报告")
  public BaseResponse<Boolean> deleteInjuryReport(
      @PathVariable("id") Integer id,
      @RequestParam Integer userId) {
    if (id == null || userId == null) {
      throw new BusinessException(ErrorCode.PARAMS_ERROR);
    }

    // 删除伤病报告
    boolean result = injuryReportService.deleteInjuryReport(id, userId);
    return ResultUtils.success(result);
  }

  /**
   * 获取伤病报告详情
   *
   * @param id 伤病报告ID
   * @return 伤病报告详情
   */
  @GetMapping("/report/{id}")
  @ApiOperation(value = "获取伤病报告详情")
  public BaseResponse<InjuryReportVO> getInjuryReport(@PathVariable("id") Integer id) {
    if (id == null) {
      throw new BusinessException(ErrorCode.PARAMS_ERROR);
    }

    // 获取伤病报告详情
    InjuryReportVO injuryReportVO = injuryReportService.getInjuryReportById(id);
    return ResultUtils.success(injuryReportVO);
  }

  /**
   * 获取伤病报告详情（包含预约信息）
   *
   * @param id 伤病报告ID
   * @return 伤病报告详情（包含预约信息）
   */
  @GetMapping("/report/detail/{id}")
  @ApiOperation(value = "获取伤病报告详情（包含预约信息）")
  public BaseResponse<InjuryReportDetailVO> getInjuryReportDetail(@PathVariable("id") Integer id) {
    if (id == null) {
      throw new BusinessException(ErrorCode.PARAMS_ERROR);
    }

    // 获取伤病报告详情（包含预约信息）
    InjuryReportDetailVO detailVO = injuryReportService.getInjuryReportDetail(id);
    return ResultUtils.success(detailVO);
  }

  /**
   * 分页获取用户的伤病报告列表
   *
   * @param userId  用户ID
   * @param current 当前页
   * @param size    每页大小
   * @return 伤病报告列表
   */
  @GetMapping("/report/list")
  @ApiOperation(value = "分页获取用户的伤病报告列表")
  public BaseResponse<Page<InjuryReportVO>> listUserInjuryReports(
      @RequestParam Integer userId,
      @RequestParam(defaultValue = "1") @ApiParam("当前页") long current,
      @RequestParam(defaultValue = "10") @ApiParam("每页大小") long size) {
    if (userId == null) {
      throw new BusinessException(ErrorCode.PARAMS_ERROR);
    }

    // 分页获取伤病报告列表
    Page<InjuryReportVO> page = injuryReportService.listUserInjuryReports(userId, current, size);
    return ResultUtils.success(page);
  }

  /**
   * 管理员/教师获取所有伤病报告列表（分页）
   *
   * @param current   当前页
   * @param size      每页大小
   * @param keyword   关键词搜索（可选）
   * @param startDate 开始日期（可选）
   * @param endDate   结束日期（可选）
   * @param severity  严重程度（可选，枚举：轻微、中等、严重）
   * @param status    状态（可选，枚举：新提交、处理中、已解决、关闭）
   * @param request   HTTP请求
   * @return 伤病报告列表
   */
  @GetMapping("/admin/report/list")
  @ApiOperation(value = "管理员/教师获取所有伤病报告列表")
  public BaseResponse<Page<InjuryReportVO>> listAllInjuryReports(
      @RequestParam(defaultValue = "1") @ApiParam("当前页") long current,
      @RequestParam(defaultValue = "10") @ApiParam("每页大小") long size,
      @RequestParam(required = false) @ApiParam("关键词") String keyword,
      @RequestParam(required = false) @ApiParam("开始日期") String startDate,
      @RequestParam(required = false) @ApiParam("结束日期") String endDate,
      @RequestParam(required = false) @ApiParam("严重程度") String severity,
      @RequestParam(required = false) @ApiParam("状态") String status,
      HttpServletRequest request) {
    // 权限验证（教师或管理员）
    Integer userId = (Integer) request.getSession().getAttribute("userId");
    if (userId == null) {
      throw new BusinessException(ErrorCode.NOT_LOGIN_ERROR);
    }
    // TODO: 验证是否为管理员或教师

    // 分页获取所有伤病报告
    Page<InjuryReportVO> page = injuryReportService.listAllInjuryReports(current, size,
        keyword, startDate, endDate, severity, status);
    return ResultUtils.success(page);
  }

  /**
   * 管理员/教师添加诊断或治疗建议
   *
   * @param reportId  伤病报告ID
   * @param diagnosis 诊断结果
   * @param treatment 治疗建议
   * @param status    更新状态（枚举：处理中、已解决、关闭）
   * @param request   HTTP请求
   * @return 更新结果
   */
  @PostMapping("/admin/report/diagnosis")
  @ApiOperation(value = "管理员/教师添加诊断或治疗建议")
  public BaseResponse<Boolean> addDiagnosisAndTreatment(
      @RequestParam @ApiParam("伤病报告ID") Integer reportId,
      @RequestParam @ApiParam("诊断结果") String diagnosis,
      @RequestParam @ApiParam("治疗建议") String treatment,
      @RequestParam @ApiParam("状态") String status,
      HttpServletRequest request) {
    // 校验状态参数
    if (!"处理中".equals(status) && !"已解决".equals(status) && !"关闭".equals(status)) {
      throw new BusinessException(ErrorCode.PARAMS_ERROR, "状态参数错误");
    }

    // 权限验证（教师或管理员）
    Integer userId = (Integer) request.getSession().getAttribute("userId");
    if (userId == null) {
      throw new BusinessException(ErrorCode.NOT_LOGIN_ERROR);
    }
    // TODO: 验证是否为管理员或教师

    // 添加诊断和治疗建议
    boolean result = injuryReportService.addDiagnosisAndTreatment(reportId, diagnosis, treatment, status, userId);
    return ResultUtils.success(result);
  }

  /**
   * 获取伤病报告统计数据
   *
   * @param startDate 开始日期（可选）
   * @param endDate   结束日期（可选）
   * @param request   HTTP请求
   * @return 统计数据
   */
  @GetMapping("/admin/report/stats")
  @ApiOperation(value = "获取伤病报告统计数据")
  public BaseResponse<Object> getInjuryReportStats(
      @RequestParam(required = false) @ApiParam("开始日期") String startDate,
      @RequestParam(required = false) @ApiParam("结束日期") String endDate,
      HttpServletRequest request) {
    // 权限验证（教师或管理员）
    Integer userId = (Integer) request.getSession().getAttribute("userId");
    if (userId == null) {
      throw new BusinessException(ErrorCode.NOT_LOGIN_ERROR);
    }
    // TODO: 验证是否为管理员或教师

    // 获取统计数据
    Object statsData = injuryReportService.getInjuryReportStats(startDate, endDate);
    return ResultUtils.success(statsData);
  }

  /**
   * 批量导出伤病报告
   *
   * @param ids       伤病报告ID列表（可选，为空则导出符合条件的所有）
   * @param startDate 开始日期（可选）
   * @param endDate   结束日期（可选）
   * @param severity  严重程度（可选，枚举：轻微、中等、严重）
   * @param request   HTTP请求
   * @return 文件下载链接
   */
  @PostMapping("/admin/report/export")
  @ApiOperation(value = "批量导出伤病报告")
  public BaseResponse<String> exportInjuryReports(
      @RequestParam(required = false) @ApiParam("伤病报告ID列表") String ids,
      @RequestParam(required = false) @ApiParam("开始日期") String startDate,
      @RequestParam(required = false) @ApiParam("结束日期") String endDate,
      @RequestParam(required = false) @ApiParam("严重程度") String severity,
      HttpServletRequest request) {
    // 权限验证（教师或管理员）
    Integer userId = (Integer) request.getSession().getAttribute("userId");
    if (userId == null) {
      throw new BusinessException(ErrorCode.NOT_LOGIN_ERROR);
    }
    // TODO: 验证是否为管理员或教师

    // 导出伤病报告
    String downloadUrl = injuryReportService.exportInjuryReports(ids, startDate, endDate, severity);
    return ResultUtils.success(downloadUrl);
  }
}
